package com.gdust.hzx.manager.service.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.core.lang.UUID;
import com.gdust.hzx.manager.service.ValidateCodeService;
import com.gdust.hzx.model.vo.system.ValidateCodeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * ClassName: ValidateCodeServiceImpl
 * Package: com.gdust.spzx.manager.service.impl
 * Description:实现验证码生成服务的实现类，生成图片验证码并存储在 Redis 中。
 *
 * @Author syun
 * @Create 2024/11/4 21:29
 * @Version 1.0
 */
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
    // 注入 RedisTemplate，用于与 Redis 进行数据交互
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 生成图片验证码，并将验证码存储在 Redis 中，同时返回包含验证码信息的 VO 对象。
     * 1. 生成图片验证码。
     * 2. 将验证码数据存入 Redis。
     * 3. 返回验证码的键和值的 VO 对象，其中图片验证码数据为经过 base64 编码的字符串。
     *
     * @return 包含验证码键和 base64 编码图片数据的 ValidateCodeVo 对象
     */
    @Override
    public ValidateCodeVo generateValidateCode() {

        //1.使用Hutool工具包生成图片验证码
        //参数：宽  高  验证码位数 干扰线数量
        CircleCaptcha circleCaptcha
                = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2);
        // 获取生成的验证码字符值（4 位）
        String codeValue = circleCaptcha.getCode();
        //返回图片验证码，base64编码
        String imageBase64 = circleCaptcha.getImageBase64();

        //2.将图片验证码存入Redis中，设置图片验证码的key：uuid,value:验证码值
        //设置过期时间
        String key = UUID
                .randomUUID()
                .toString()
                .replaceAll("-","");
        //void set(K key, V value, long timeout, TimeUnit unit);
        redisTemplate.opsForValue().set("user:validate"+key,
                codeValue,
                5,
                TimeUnit.MINUTES);


        //3.返回ValidateCodeVo对象
        //新建ValidateCodeVo对象，内含验证码key，和验证码value
        ValidateCodeVo validateCodeVo = new ValidateCodeVo();
        validateCodeVo.setCodeKey(key);
        validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);//放入base64加密的图片验证码

        // 返回包含验证码信息的 VO 对象
        return validateCodeVo;
    }
}
